package com.catchu.pattern.creational.simplefactory;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * @author 刘俊重
 * @Description 这是工厂模式
 * @date 17:12
 */
public class Factory {

    /**
     * @Description 具体创建接口的实现类的方法
     * @Author 刘俊重
     * @Date 2017/9/22
     * @param  condition 根据传入的参数生成不同的实现类
     */
    public static Api createApi(int condition){
        Api api = null;
        if(condition==1){
            api = new ApiImplA();
        }else if(condition==2){
            api = new ApiImplB();
        }
        return api;
    }

    /**
     * @Description 测试不传入参数，而是通过配置文件读取需要调用哪个实现类生成对象,
     * 这样就不需要每次变化一个实现类就修改一个if...else了。
     * @Author 刘俊重
     * @Date 2017/9/22
     */
    public static Api createApiByProperties(){
        //读取配置文件
        Properties properties = new Properties();
        InputStream inputStream = null;
        try {
            inputStream = Factory.class.getResourceAsStream("factory.properties");
            properties.load(inputStream);
        } catch (IOException e) {
            System.out.println("读取配置文件出错：");
            e.printStackTrace();
        }finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

        //利用反射创建对象
        Api api = null;
        try {
            api = (Api) Class.forName(properties.getProperty("ImplClass")).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return api;
    }

}
